import dayjs from 'dayjs';
// import 'dayjs/locale/zh-cn';
import relativeTime from 'dayjs/plugin/relativeTime';

// 拓展 from插件
dayjs.extend(relativeTime);

import config from '@/common/config.js';

export { dayjs };
/**
 * 格化式日期工具
 * @param {*} value  日期时间
 * @param {*} fmt
 */
export const formatTime = (value, fmt = config.data.format) => {
	if (!value) return '';
	return dayjs(value).format(fmt);
};

/**
 * fromNow工具方法
 * @param {*} value  日期时间
 * @param {*} withoutSuffix 是否删除后缀
 *
 * @examples
 *
 *  1. formNow('2020-03-04 14:43:00')    => 30秒前
 *
 *  2. formNow('2020-03-04 14:43:00')    => 30秒
 * 
 * 输出示例：
  范围	             键值	         示例输出
  0  到 44 秒	        s	          几秒前
  45 到 89 秒	        m	          1 分钟前
  90 秒 到 44 分	    mm	        2 分钟前 ... 44 分钟前
  45 到 89 分	        h	          1 小时前
  90 分 到 21 小时	  hh	         2 小时前 ... 21 小时前
  22 到 35 小时	      d	          1 天前
  36 小时 到 25 天	  dd	         2 天前 ... 25 天前
  26 到 45 天	        M	          1 个月前
  46 天 到 10 月	    MM	         2 个月前 ... 10 个月前
  11 月 到 17 月	    y	          1 年前
  18 月以上	          yy	        2 年前 ... 20 年前
 */
export const fromNow = (value, withoutSuffix = false) => {
	if (!value) return '';
	return dayjs(value).fromNow(!!withoutSuffix);
};

/**
 *  返回当前时间是当日的什么时候
 *    主要分为 6个时间段 0 - 4 4- 7....
 * @returns {string}
 * @param time
 */
export const showHelloTime = time => {
	let time_format = '';
	if (time == undefined) {
		time = new Date();
	}
	let hr = time.getHours();
	if (hr >= 0 && hr <= 4) time_format = '深夜了，注意身体，';
	if (hr >= 4 && hr < 7) time_format = '清晨好， ';
	if (hr >= 7 && hr < 12) time_format = '早安，';
	if (hr >= 12 && hr <= 13) time_format = '午饭时间到了，';
	if (hr >= 13 && hr <= 17) time_format = '下午好，';
	if (hr >= 17 && hr <= 18) time_format = '进入傍晚了，';
	if (hr >= 18 && hr <= 20) time_format = '吃过晚饭了吗，';
	if (hr >= 20 && hr <= 24) time_format = '在加班吗？辛苦了，';
	return time_format;
};
/**
 * 是否为闫年
 * @return {Boolse} true|false
 */
export const isLeapYear = function(y) {
	return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0;
};

/**
 * 返回星期数
 * @return {Number}
 */
export const getWhatDay = function(year, month, day) {
	let date = new Date(year + '/' + month + '/' + day);
	let index = date.getDay();
	let dayNames = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
	return dayNames[index];
};

/**
 * 返回星期数
 * @return {Number}
 */
export const getMonthPreDay = function(year, month) {
	let date = new Date(year + '/' + month + '/01');
	let day = date.getDay();
	if (day == 0) {
		day = 7;
	}
	return day;
};

/**
 * 返回月份天数
 * @return {Number}
 */
export const getMonthDays = function(year, month) {
	if (/^0/.test(month)) {
		month = month.split('')[1];
	}
	return [0, 31, this.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
};

/**
 * 补齐数字位数
 * @return {string}
 */
export const getNumTwoBit = function(n) {
	n = Number(n);
	return (n > 9 ? '' : '0') + n;
};

/**
 * 日期对象转成字符串
 * @return {string}
 */
export const date2Str = function(date, split) {
	if (typeof date == 'string') return date;
	split = split || '-';
	let y = date.getFullYear();
	let m = this.getNumTwoBit(date.getMonth() + 1);
	let d = this.getNumTwoBit(date.getDate());
	return [y, m, d].join(split);
};

/**
 * 返回日期格式字符串
 * @param {Number} 0返回今天的日期、1返回明天的日期，2返回后天得日期，依次类推
 * @return {string} '2014-12-31'
 */
export const getDay = function(i) {
	i = i || 0;
	let date = new Date();
	let diff = i * (1000 * 60 * 60 * 24);
	date = new Date(date.getTime() + diff);
	return this.date2Str(date);
};

/**
 * 时间戳转换为日期格式
 * @return {String}
 */
export const timestampToDate = function(timestamp) {
	let date = new Date(timestamp);
	return date.getFullYear() + '-' + getNumTwoBit(date.getMonth() + 1) + '-' + getNumTwoBit(date.getDate());
};

/**
 * 时间比较
 * @return {Boolean}
 */
export const compareDate = function(date1, date2) {
	let startTime = new Date(date1.replace('-', '/').replace('-', '/'));
	let endTime = new Date(date2.replace('-', '/').replace('-', '/'));
	if (startTime >= endTime) {
		return false;
	}
	return true;
};
/**
 * 时间比较
 * @return {Boolean}
 */
export const compareDateArr = function(date1, date2) {
	let startTime = new Date();
	startTime.setFullYear(date1[0], date1[1], date1[2]);
	startTime.setHours(date1[3], date1[4]);
	let endTime = new Date();
	endTime.setFullYear(date2[0], date2[1], date2[2]);
	endTime.setHours(date2[3], date2[4]);
	if (startTime >= endTime) {
		return false;
	}
	return true;
};
/**
 * 时间是否相等
 * @return {Boolean}
 */
export const isEqual = function(date1, date2) {
	let startTime = new Date(date1).getTime();
	let endTime = new Date(date2).getTime();
	if (startTime == endTime) {
		return true;
	}
	return false;
};
export const getDateArr = function(str) {
	return [this.getYear(str), this.getMonth(str), this.getDate(str), this.getHour(str), this.getMinute(str)];
};

export const isDateString = str => {
	return /\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}/.test(str) || /^([01][0-9]|2[0-3])(:[0-5][0-9]){1,2}$/.test(str);
};

export const getYear = value => {
	return this.isDateString(value) ? value.split(' ')[0].split(/-|\/|\./)[0] : value.getFullYear();
};

export const getMonth = value => {
	return this.isDateString(value) ? value.split(' ')[0].split(/-|\/|\./)[1] : value.getMonth() + 1;
};

export const getDate = value => {
	return this.isDateString(value) ? value.split(' ')[0].split(/-|\/|\./)[2] : value.getDate();
};

export const getHour = value => {
	if (this.isDateString(value)) {
		const str = value.split(' ')[1] || '00:00:00';
		return str.split(':')[0];
	}
	return value.getHours();
};

export const getMinute = value => {
	if (this.isDateString(value)) {
		const str = value.split(' ')[1] || '00:00:00';
		return str.split(':')[1];
	}
	return value.getMinutes();
};
